import operator
from dataclasses import dataclass,field
# 1.dataclass基本使用
# @dataclass  # 使用 dataclass装饰器，让student类成为dataclass
# class student():
#     name:str
#     age: int
#
# s1 = student('kavi',17)
# s2 = student('ami',20)
# print(s1,s2) # 通过dataclass创建的实例，内部已经实现好了 __str__ 函数，会按照指定的格式打印
# print(s1==s2) # 内部把 __repr__ 方法也实现了 （比较对比的方法）。 只有在每个属性都相同的时候才会认为两个对象是相同的。

# 2.自定义属性的行为
# @dataclass(frozen=True,order=True)  # 使用 dataclass装饰器，让student类成为dataclass. frozen代表生成的对象是否可被修改，order表示对象实例是否支持排序（即在列表中存放这些对象的时候能否使用相关的sorted方法进行排序，默认是按照属性的顺序从前往后依次比较。通过调整属性顺序设置根据什么进行排序）
# class student():
#     name:str
#     age: int = 18 # 设置属性的缺省值，不传默认就是 18了
#     # 通过创建满足要求的field对象，来让 independent属性具备特定的行为。default代表默认值，init代表是否在init构造函数中体现该属性（false表示不出现在init函数中），repr表示打印时是否体现该属性,compare表示该属性是否参加对象的比较运算中
#     independent: bool = field(default=True,init=False,repr=True,compare=True)
#
#
# s1 = student('kavi')
# s2 = student('ami',20)
# ss = [s1,s2]
# print(s1,s2)
# print(s1==s2)
# print(sorted(ss))


# 3.更灵活的方式自定义属性的行为 + 第二种设置排序的方法
@dataclass()
class student():
    name:str
    age: int = 18 # 设置属性的缺省值，不传默认就是 18了
    independent: bool = field(default=True,init=False,repr=True)
    def __post_init__(self): # 这个函数会在实例初始化完成之后 执行。在这里可以做一些更加灵活的自定义属性的方法
        self.independent = self.age > 18 # 让属性的赋值加入一些逻辑行为

s1 = student('kavi')
s2 = student('ami',20)
ss = [s2,s1]
print(s1,s2)
print(s1==s2)
ss.sort(key=operator.attrgetter('age'))  # 通过往sort方法中传入key，指定排序规则来完成排序。
print(ss)


